void CALLBACK ProcRedraw (HANDLE hLcWnd, int Elapsed);
//-----------------------------------------------
void DemoRedraw (HANDLE hLcWnd)
{
static int Mode = 1; // 0-stop redraw, 1-start redraw
static bool bSetCenter = true;
HANDLE hBlock, hEnt, hPline;
double Len, Step;
if (Mode == 0){
// stop auto-redraw
lcWndRedrawAuto( hLcWnd, 0, 0 );
Mode = 1;
}else{
hBlock = lcPropGetHandle( hLcWnd, LC_PROP_WND_VIEWBLOCK );
hEnt = lcBlockGetEntByKey( hBlock, 151 );
if (hEnt){
if (lcEntType( hEnt, LC_ENT_BLOCKREF ) == TRUE){
hPline = lcBlockGetEntByKey( hBlock, 152 ); // this polyline is used as a track for entity hEnt
if (lcEntType( hPline, LC_ENT_POLYLINE ) == TRUE){
lcPropPutHandle( hLcWnd, LC_PROP_WND_HANDLE0, hEnt );
lcPropPutHandle( hLcWnd, LC_PROP_WND_HANDLE1, hPline );
Len = lcPropGetFloat( hPline, LC_PROP_PLINE_LEN ); // polyline (track) length
lcPropPutFloat( hLcWnd, LC_PROP_WND_FLOAT0, Len );
lcPropPutFloat( hLcWnd, LC_PROP_WND_FLOAT1, 0.0 ); // start distance
Step = Len / 300.0;
lcPropPutFloat( hLcWnd, LC_PROP_WND_FLOAT2, Step ); // distance increment
lcPropPutInt( hLcWnd, LC_PROP_WND_INT0, 0 ); // 0-forward, 1-backward movement
lcPropPutInt( hLcWnd, LC_PROP_WND_INT1, bSetCenter );
// start redraw by timer
lcWndRedrawAuto( hLcWnd, 33, ProcRedraw );
bSetCenter = !bSetCenter;
Mode = 0;
return;
}
}
}
lcWndMessage( hLcWnd, L"UAV and track are not found\nLoad the drawing \"UAV demo.lcd\"", LC_MB_OK | LC_MB_ICONSTOP );
}
}
//-----------------------------------------------
void CALLBACK ProcRedraw (HANDLE hLcWnd, int Elapsed)
{
HANDLE hDrw, hBlock, hUAV, hPline;
double X, Y, Ang, Len, Pos, Step;
int Backward, SetCenter;
hBlock = lcPropGetHandle( hLcWnd, LC_PROP_WND_VIEWBLOCK );
hUAV = lcPropGetHandle( hLcWnd, LC_PROP_WND_HANDLE0 );
hPline = lcPropGetHandle( hLcWnd, LC_PROP_WND_HANDLE1 );
Len = lcPropGetFloat( hLcWnd, LC_PROP_WND_FLOAT0 ); // track length
Pos = lcPropGetFloat( hLcWnd, LC_PROP_WND_FLOAT1 ); // distance of current position
Step = lcPropGetFloat( hLcWnd, LC_PROP_WND_FLOAT2 ); // distance increment
Backward = lcPropGetInt( hLcWnd, LC_PROP_WND_INT0 ); // backward movement
SetCenter = lcPropGetInt( hLcWnd, LC_PROP_WND_INT1 ); // "Set view center" mode
lcPlineGetPoint( hPline, Pos, &X, &Y, &Ang );
lcPropPutFloat( hUAV, LC_PROP_BLKREF_X, X );
lcPropPutFloat( hUAV, LC_PROP_BLKREF_Y, Y );
if (Backward){
Ang = Ang + LC_DEG180;
}
lcPropPutFloat( hUAV, LC_PROP_BLKREF_ANGLE, Ang );
lcEntUpdate( hUAV );
// set parameters for next redraw
if (Backward){
Pos -= Step;
if (Pos < 0.0){
Pos = 0.0;
Backward = 0;
}
}else{
Pos += Step;
if (Pos > Len){
Pos = Len;
Backward = 1;
}
}
lcPropPutFloat( hLcWnd, LC_PROP_WND_FLOAT1, Pos ); // next position
lcPropPutInt( hLcWnd, LC_PROP_WND_INT0, Backward );
if (SetCenter){
// set view center
lcPropPutFloat( hLcWnd, LC_PROP_WND_XCEN, X );
lcPropPutFloat( hLcWnd, LC_PROP_WND_YCEN, Y );
}
// disable message "Drawing was changed, save it?" when the drawing will be closed
hDrw = lcPropGetHandle( hLcWnd, LC_PROP_WND_DRW );
lcPropPutBool( hDrw, LC_PROP_DRW_DIRTY, false );
}